using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;

using UMEVOR.DTO;

using Microsoft.Practices.EnterpriseLibrary.Data;

namespace UMEVOR.DAL
{
    public class DALT_ATIVIDADE : DALConnection
    {

        #region Incluir

        public void incluir(T_ATIVIDADE obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" INSERT INTO T_ATIVIDADE ");
                SQL.Append("    (ID_CASA_ESPIRITA,DT_INICIO, DT_FIM, HR_INICIO, HR_FIM, TX_TITULO) ");
                SQL.Append(" VALUES ");
                SQL.Append("    (" + obj.ID_CASA_ESPIRITA.ToString() + ",");

                if (obj.DT_INICIO.ToString("dd/MM/yyyy").Equals("01/01/0001"))
                    SQL.Append(" null, ");
                else
                    SQL.Append(" str_to_date('" + obj.DT_INICIO.ToString("dd/MM/yyyy") + "', '%d/%m/%Y'), ");

                if (obj.DT_FIM.ToString("dd/MM/yyyy").Equals("01/01/0001"))
                    SQL.Append("    null, ");
                else
                    SQL.Append("    str_to_date('" + obj.DT_FIM.ToString("dd/MM/yyyy") + "', '%d/%m/%Y'), ");

                if (obj.HR_INICIO.ToString("HH:mm:ss").Equals("00:00:00"))
                    SQL.Append("   null, ");
                else
                    SQL.Append("    time('" + obj.HR_INICIO.ToString("HH:mm:ss") + "'), ");

                if (obj.HR_FIM.ToString("HH:mm:ss").Equals("00:00:00"))
                    SQL.Append("null, '" + obj.TX_TITULO + "') ");
                else
                    SQL.Append("time('" + obj.HR_FIM.ToString("HH:mm:ss") + "'), '" + obj.TX_TITULO + "') ");
                
                DbCommand insertT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());

                insertT_ATIVIDADE.CommandText = SQL.ToString();

                database.ExecuteNonQuery(insertT_ATIVIDADE, DALConnection.transaction);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Incluir[]

        public void incluir(T_ATIVIDADE[] obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();
                DbCommand[] insertT_ATIVIDADE = new DbCommand[obj.Length];

                for (int index = 0; index < obj.Length; index++)
                {
                    T_ATIVIDADE o = obj[index];
                    SQL = new StringBuilder();

                    SQL.Append(" INSERT INTO T_ATIVIDADE ");
                    SQL.Append("    (ID_ATIVIDADE, ID_CASA_ESPIRITA, DT_INICIO, DT_FIM, TX_TITULO) ");
                    SQL.Append(" VALUES ");
                    SQL.Append("    (:ID_ATIVIDADE, :ID_CASA_ESPIRITA, :DT_INICIO, :DT_FIM, :TX_TITULO) ");

                    insertT_ATIVIDADE[index] = database.GetSqlStringCommand(SQL.ToString());

                    database.AddInParameter(insertT_ATIVIDADE[index], ":ID_ATIVIDADE", DbType.Int64, o.ID_ATIVIDADE);
                    database.AddInParameter(insertT_ATIVIDADE[index], ":ID_CASA_ESPIRITA", DbType.Int64, o.ID_CASA_ESPIRITA);
                    database.AddInParameter(insertT_ATIVIDADE[index], ":DT_INICIO", DbType.DateTime, o.DT_INICIO);
                    database.AddInParameter(insertT_ATIVIDADE[index], ":DT_FIM", DbType.DateTime, o.DT_FIM);
                    database.AddInParameter(insertT_ATIVIDADE[index], ":TX_TITULO", DbType.String, o.TX_TITULO);

                    insertT_ATIVIDADE[index].CommandText = SQL.ToString();
                }

                try
                {
                    foreach (DbCommand cmd in insertT_ATIVIDADE)
                    {
                        database.ExecuteNonQuery(cmd, DALConnection.transaction);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Alterar

        public void alterar(T_ATIVIDADE obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" UPDATE T_ATIVIDADE SET ");
                SQL.Append("    ID_CASA_ESPIRITA = " + obj.ID_CASA_ESPIRITA.ToString() + ",");

                if (obj.DT_INICIO.ToString("dd/MM/yyyy").Equals("01/01/0001"))
                    SQL.Append("    DT_INICIO = null , ");
                else
                    SQL.Append("    DT_INICIO = str_to_date('" + obj.DT_INICIO.ToString("dd/MM/yyyy") + "', '%d/%m/%Y') , ");

                if (obj.DT_FIM.ToString("dd/MM/yyyy").Equals("01/01/0001"))
                    SQL.Append("    DT_FIM = null , ");
                else
                    SQL.Append("    DT_FIM = str_to_date('" + obj.DT_FIM.ToString("dd/MM/yyyy") + "', '%d/%m/%Y') , ");

                if (obj.HR_INICIO.ToString("HH:mm:ss").Equals("00:00:00"))
                    SQL.Append("    HR_INICIO = null , ");
                else
                    SQL.Append("    HR_INICIO = time('" + obj.HR_INICIO.ToString("HH:mm:ss") + "') , ");

                if (obj.HR_FIM.ToString("HH:mm:ss").Equals("00:00:00"))
                    SQL.Append("    HR_FIM = null , ");
                else
                    SQL.Append("    HR_FIM = time('" + obj.HR_FIM.ToString("HH:mm:ss") + "') , ");

                SQL.Append("    TX_TITULO = '" + obj.TX_TITULO + "' ");
                SQL.Append(" WHERE ");
                SQL.Append("     ID_ATIVIDADE = " + obj.ID_ATIVIDADE.ToString());
                
                DbCommand updateT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());

                updateT_ATIVIDADE.CommandText = SQL.ToString();

                database.ExecuteNonQuery(updateT_ATIVIDADE, DALConnection.transaction);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Alterar[]

        public void alterar(T_ATIVIDADE[] obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();
                DbCommand[] updateT_ATIVIDADE = new DbCommand[obj.Length];

                for (int index = 0; index < obj.Length; index++)
                {
                    T_ATIVIDADE o = obj[index];
                    SQL = new StringBuilder();
                    SQL.Append(" UPDATE T_ATIVIDADE SET ");
                    SQL.Append("    ID_CASA_ESPIRITA = :ID_CASA_ESPIRITA , ");
                    SQL.Append("    DT_INICIO = :DT_INICIO , ");
                    SQL.Append("    DT_FIM = :DT_FIM , ");
                    SQL.Append("    TX_TITULO = :TX_TITULO ");
                    SQL.Append(" WHERE ");
                    SQL.Append("     ID_ATIVIDADE = :ID_ATIVIDADE  ");

                    updateT_ATIVIDADE[index] = database.GetSqlStringCommand(SQL.ToString());

                    database.AddInParameter(updateT_ATIVIDADE[index], ":ID_ATIVIDADE", DbType.Int64, o.ID_ATIVIDADE);
                    database.AddInParameter(updateT_ATIVIDADE[index], ":ID_CASA_ESPIRITA", DbType.Int64, o.ID_CASA_ESPIRITA);
                    database.AddInParameter(updateT_ATIVIDADE[index], ":DT_INICIO", DbType.DateTime, o.DT_INICIO);
                    database.AddInParameter(updateT_ATIVIDADE[index], ":DT_FIM", DbType.DateTime, o.DT_FIM);
                    database.AddInParameter(updateT_ATIVIDADE[index], ":TX_TITULO", DbType.String, o.TX_TITULO);

                    updateT_ATIVIDADE[index].CommandText = SQL.ToString();
                }

                try
                {
                    foreach (DbCommand cmd in updateT_ATIVIDADE)
                    {
                        database.ExecuteNonQuery(cmd, DALConnection.transaction);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Excluir

        public void excluir(T_ATIVIDADE obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" DELETE FROM T_ATIVIDADE ");
                SQL.Append(" WHERE ");
                SQL.Append("     ID_ATIVIDADE = " + obj.ID_ATIVIDADE.ToString());

                DbCommand deleteT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());

                deleteT_ATIVIDADE.CommandText = SQL.ToString();

                database.ExecuteNonQuery(deleteT_ATIVIDADE, DALConnection.transaction);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region Excluir[]

        public void excluir(T_ATIVIDADE[] obj)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();
                DbCommand[] deleteT_ATIVIDADE = new DbCommand[obj.Length];

                for (int index = 0; index < obj.Length; index++)
                {
                    T_ATIVIDADE o = obj[index];
                    SQL = new StringBuilder();
                    SQL.Append(" DELETE FROM T_ATIVIDADE ");
                    SQL.Append(" WHERE ");
                    SQL.Append("     ID_ATIVIDADE = :ID_ATIVIDADE  ");

                    deleteT_ATIVIDADE[index] = database.GetSqlStringCommand(SQL.ToString());

                    database.AddInParameter(deleteT_ATIVIDADE[index], ":ID_ATIVIDADE", DbType.Int64, o.ID_ATIVIDADE);

                    deleteT_ATIVIDADE[index].CommandText = SQL.ToString();
                }

                try
                {
                    foreach (DbCommand cmd in deleteT_ATIVIDADE)
                    {
                        database.ExecuteNonQuery(cmd, DALConnection.transaction);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region ObterPorPK

        public T_ATIVIDADE obterPorPK(long pID_ATIVIDADE)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" SELECT * FROM T_ATIVIDADE ");
                SQL.Append(" WHERE ");
                SQL.Append("  ID_ATIVIDADE = " + pID_ATIVIDADE.ToString() + " ORDER BY TX_TITULO");


                DbCommand consultaT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());
                consultaT_ATIVIDADE.CommandText = SQL.ToString();

                IDataReader reader = database.ExecuteReader(consultaT_ATIVIDADE, DALConnection.transaction);
                T_ATIVIDADE obj = null;

                if (reader.Read())
                {
                    obj = new T_ATIVIDADE();
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_ATIVIDADE")))
                    {
                        obj.ID_ATIVIDADE = Int64.Parse(reader["ID_ATIVIDADE"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_CASA_ESPIRITA")))
                    {
                        obj.ID_CASA_ESPIRITA = Int64.Parse(reader["ID_CASA_ESPIRITA"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_INICIO")))
                    {
                        obj.DT_INICIO = DateTime.Parse(reader["DT_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_FIM")))
                    {
                        obj.DT_FIM = DateTime.Parse(reader["DT_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_INICIO")))
                    {
                        obj.HR_INICIO = DateTime.Parse(reader["HR_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_FIM")))
                    {
                        obj.HR_FIM = DateTime.Parse(reader["HR_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("TX_TITULO")))
                    {
                        obj.TX_TITULO = reader["TX_TITULO"].ToString();
                    }
                }
                reader.Dispose();
                consultaT_ATIVIDADE.Dispose();

                return obj;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region ListarTodos

        public List<T_ATIVIDADE> listarTodos()
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" SELECT * FROM T_ATIVIDADE ORDER BY TX_TITULO");

                DbCommand consultaT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());
                consultaT_ATIVIDADE.CommandText = SQL.ToString();

                IDataReader reader = database.ExecuteReader(consultaT_ATIVIDADE, DALConnection.transaction);
                List<T_ATIVIDADE> lista = new List<T_ATIVIDADE>();
                T_ATIVIDADE obj = null;

                while (reader.Read())
                {
                    obj = new T_ATIVIDADE();
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_ATIVIDADE")))
                    {
                        obj.ID_ATIVIDADE = Int64.Parse(reader["ID_ATIVIDADE"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_CASA_ESPIRITA")))
                    {
                        obj.ID_CASA_ESPIRITA = Int64.Parse(reader["ID_CASA_ESPIRITA"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_INICIO")))
                    {
                        obj.DT_INICIO = DateTime.Parse(reader["DT_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_FIM")))
                    {
                        obj.DT_FIM = DateTime.Parse(reader["DT_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_INICIO")))
                    {
                        obj.HR_INICIO = DateTime.Parse(reader["HR_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_FIM")))
                    {
                        obj.HR_FIM = DateTime.Parse(reader["HR_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("TX_TITULO")))
                    {
                        obj.TX_TITULO = reader["TX_TITULO"].ToString();
                    }
                    lista.Add(obj);
                }
                reader.Dispose();
                consultaT_ATIVIDADE.Dispose();

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<VOT_ATIVIDADE> consultar(string titulo, int idCasaEspirita, DateTime inicio, DateTime fim)
        {
            StringBuilder SQL = new StringBuilder();
            try
            {
                Database database = getDatabase();

                SQL.Append(" SELECT A.TX_TITULO AS TX_TITULO,A.ID_ATIVIDADE AS ID_ATIVIDADE, A.ID_CASA_ESPIRITA AS ID_CASA_ESPIRITA,");
                SQL.Append(" A.DT_INICIO AS DT_INICIO, A.DT_FIM AS DT_FIM, U.TX_NOME_INSTITUICAO AS TX_NOME_INSTITUICAO, ");
                SQL.Append("A.HR_INICIO AS HR_INICIO, A.HR_FIM AS HR_FIM FROM T_ATIVIDADE A, T_CASA_ESPIRITA U WHERE ");
                SQL.Append("A.ID_CASA_ESPIRITA = U.ID_CASA_ESPIRITA AND A.TX_TITULO LIKE '" + titulo + "%'");

                if (!idCasaEspirita.Equals(0))
                    SQL.Append(" AND A.ID_CASA_ESPIRITA = " + idCasaEspirita.ToString());

                if ((inicio.ToString("dd/MM/yyyy") != "01/01/0001") && (fim.ToString("dd/MM/yyyy") != "01/01/0001"))
                    SQL.Append(" AND A.DT_INICIO >= str_to_date('" + inicio.ToString() + "', '%d/%m/%Y  %H:%i:%s') AND A.DT_FIM <= str_to_date('" + fim.ToString() + "', '%d/%m/%Y  %H:%i:%s')");
                else
                {
                    if (inicio.ToString("dd/MM/yyyy") != "01/01/0001")
                        SQL.Append(" AND A.DT_INICIO = str_to_date('" + inicio.ToString() + "', '%d/%m/%Y  %H:%i:%s')");

                    if (fim.ToString("dd/MM/yyyy") != "01/01/0001")
                        SQL.Append(" AND A.DT_FIM = str_to_date('" + fim.ToString() + "', '%d/%m/%Y  %H:%i:%s')");
                }
                SQL.Append(" ORDER BY A.TX_TITULO,A.DT_INICIO,A.DT_FIM");

                DbCommand consultaT_ATIVIDADE = database.GetSqlStringCommand(SQL.ToString());
                consultaT_ATIVIDADE.CommandText = SQL.ToString();

                IDataReader reader = database.ExecuteReader(consultaT_ATIVIDADE, DALConnection.transaction);
                List<VOT_ATIVIDADE> lista = new List<VOT_ATIVIDADE>();
                VOT_ATIVIDADE obj = null;

                while (reader.Read())
                {
                    obj = new VOT_ATIVIDADE();
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_CASA_ESPIRITA")))
                    {
                        obj.ID_CASA_ESPIRITA = Int64.Parse(reader["ID_CASA_ESPIRITA"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("ID_ATIVIDADE")))
                    {
                        obj.ID_ATIVIDADE = Int64.Parse(reader["ID_ATIVIDADE"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_INICIO")))
                    {
                        obj.DT_INICIO = DateTime.Parse(reader["DT_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("DT_FIM")))
                    {
                        obj.DT_FIM = DateTime.Parse(reader["DT_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_INICIO")))
                    {
                        obj.HR_INICIO = DateTime.Parse(reader["HR_INICIO"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("HR_FIM")))
                    {
                        obj.HR_FIM = DateTime.Parse(reader["HR_FIM"].ToString());
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("TX_TITULO")))
                    {
                        obj.TX_TITULO = reader["TX_TITULO"].ToString();
                    }
                    if (!reader.IsDBNull(reader.GetOrdinal("TX_NOME_INSTITUICAO")))
                    {
                        obj.TX_CASA_ESPIRITA = reader["TX_NOME_INSTITUICAO"].ToString();
                    }
                    lista.Add(obj);
                }
                reader.Dispose();
                consultaT_ATIVIDADE.Dispose();

                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

    }
}

